/*
 *  Axolotl - Alternate persistence for Grails
 *  Copyright (C) 2008  Juanjo García Latre
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */
package com.googlecode.axolotl.jdbc;

import org.codehaus.groovy.grails.commons.GrailsDomainClass;
import org.codehaus.groovy.grails.commons.GrailsDomainClassProperty;
import org.codehaus.groovy.grails.orm.hibernate.cfg.ColumnConfig;
import org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsDomainBinder;
import org.codehaus.groovy.grails.orm.hibernate.cfg.Mapping;


public abstract class SqlNamingUtils {

	public static String getTableName(GrailsDomainClass domainClass) {
		String className = domainClass.getFullName();
		Mapping mapping = GrailsDomainBinder.getMapping(className);
		
		if (mapping != null && mapping.getTableName() != null) {
			return mapping.getTableName();
		}
		
		return underscorize( domainClass.getName() );
	}
	
	
	public static String getColumnName(GrailsDomainClassProperty property) {
		String className = property.getDomainClass().getFullName();
		Mapping mapping = GrailsDomainBinder.getMapping(className);
		
		if (mapping != null) {
			ColumnConfig columnCfg = mapping.getColumn( property.getName() );
			if (columnCfg != null) {
				return columnCfg.getColumn();
			}
		}

		StringBuilder name = new StringBuilder();
			
		if (property.isInherited() && !property.isIdentity()) {
			name.append( getTableName(property.getDomainClass()) ).append('_');
		}
		
		name.append( underscorize(property.getName()) );
		
		if (property.isManyToOne() || property.isOneToOne()) {
			name.append("_id");
		}
		return name.toString();
	}
	
	
	private static String underscorize(CharSequence seq) {
		StringBuilder builder = new StringBuilder();
		for (int i = 0; i < seq.length(); i++) {
			char c = seq.charAt(i);
			if (Character.isUpperCase(c) && i > 0) {
				builder.append('_');
			}
			builder.append( Character.toLowerCase(c) );
		}
		return builder.toString();
	}
}
